<?php

App::uses('AuthComponent', 'Controller/Component');

class Usuario extends AppModel {
	public $displayField = 'username';

    public $validate = array(
		'perfil_id' => array(
            'checkBelongsTo' => array(
                'rule'  => array('checkBelongsTo', 'Perfil'),
                'required' => true,
                'message'  => 'O campo perfil é obrigatório'
            )
        ),
        'username' => array(
            'alphaNumeric' => array(
                'rule'     => 'alphaNumeric',
                'required' => true,
                'message'  => 'O campo login deve ter somente caracteres alfanuméricos'
            ),
            'between' => array(
                'rule'    => array('between', 5, 15),
                'message' => 'O campo login deve ter entre 5 e 15 caracteres'
            ),
			'unique' => array(
				'rule' => 'isUnique',
				'required' => 'create',
				'message' => 'O login já existe'
			)
        ),
        'email' => array(
			'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'O campo email é obrigatório'
            ),
            'email' => array(
                'rule' => 'email',
				'message' => 'O campo email é inválido'
            ),
			'unique' => array(
				'rule' => 'isUnique',
				'message' => 'O email já existe'
			)
		),
		'password' => array(
				'notempty' => array(
						'rule' => array('minLength', '8'),
						'required' => true,
						'allowEmpty' => false,
						'message' => 'O campo senha deve ter no mínimo 8 caracteres'
				),
				'passwordSimilar' => array(
						'rule' => 'checkPasswords',
						'message' => 'As senhas informadas são diferentes.'
				)
		),
		'ativo' => array(
			'rule' => array('boolean'),
			'message' => 'Valor incorreto para o campo ativo'
		),
		'photo' => array(
			'isUnderPhpSizeLimit' => array(
				'rule' => 'isUnderPhpSizeLimit',
				'message' => 'O arquivo excede o limite de tamanho de arquivo de upload'
			),
			'isUnderFormSizeLimit' => array(
				'rule' => 'isUnderFormSizeLimit',
				'message' => 'O arquivo excede o limite de tamanho de arquivo de upload'
			),
			'isValidExtension' => array(
				'rule' => array('isValidExtension', array('gif', 'jpg', 'png'), false),
				'message' => 'Arquivo não tem uma extensão gif, jpg ou png'
			)
		)
    );

	public $belongsTo = array(
        'Perfil' => array(
            'className' => 'Perfil',
            'foreignKey' => 'perfil_id'
        )
	);

    public $actsAs = array(
		'Acl' => array('type' => 'requester'),
		'Upload.Upload' => array(
			'photo' => array(
				'fields' => array(
					'dir' => 'photo_dir'
				)
			)
		)
	);

    public function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        if (isset($this->data['Usuario']['perfil_id'])) {
            $perfilId = $this->data['Usuario']['perfil_id'];
        } else {
            $perfilId = $this->field('perfil_id');
        }
        if (!$perfilId) {
            return null;
        } else {
            return array('Perfil' => array('id' => $perfilId));
        }
    }

	public function bindNode($usuario) {
		return array('model' => 'Usuario', 'foreign_key' => $usuario['Usuario']['perfil_id']);
	}

	public function beforeSave($options = array()){
		$this->saveChildrens();
		$this->generatePassword();

		return true;
	}

	public function saveChildrens(){
		foreach (array_keys($this->hasAndBelongsToMany) as $model){
			if(isset($this->data[$this->name][$model])){
				$this->data[$model][$model] = $this->data[$this->name][$model];
				unset($this->data[$this->name][$model]);
			}
		}
	}

	public function generatePassword() {
		if(!empty($this->data[$this->alias]['password'])) {
			$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
		}
	}

	public function checkPasswords($options = array()){
		if (isset($this->data[$this->alias]['password']) and isset($this->data[$this->alias]['password2'])){
			if ($this->data[$this->alias]['password'] == $this->data[$this->alias]['password2']){
				return true;
			}
		} else if (!isset($this->data[$this->alias]['password']) and !isset($this->data[$this->alias]['password2'])){
			return true;
		}

		return false;
	}

}